\section{Подозрительные паттерны кода}

\subsection{Инструкции XOR}
\myindex{x86!\Instructions!XOR}

Инструкции вроде \TT{XOR op, op} (например, \TT{XOR EAX, EAX}) 
обычно используются для обнуления регистра,
однако, если операнды разные, то применяется операция именно \q{исключающего или}.
Эта операция очень редко применяется в обычном программировании, но применяется очень часто в криптографии,
включая любительскую.

Особенно подозрительно, если второй операнд --- это большое число.
Это может указывать на шифрование, вычисление контрольной суммы, итд.  \\
\\
Одно из исключений из этого наблюдения о котором стоит сказать, то, что генерация и проверка значения \q{канарейки}
(\myref{subsec:BO_protection}) часто происходит, используя инструкцию \XOR.  \\
\\
\myindex{AWK}
Этот AWK-скрипт можно использовать для обработки листингов (.lst) созданных \IDA{}:

\lstinputlisting{digging_into_code/awk.sh}

Нельзя также забывать,
что если использовать подобный скрипт, то, возможно, он захватит и неверно дизассемблированный
код 
(\myref{sec:incorrectly_disasmed_code}).

\subsection{Вручную написанный код на ассемблере}

\myindex{Function prologue}
\myindex{Function epilogue}
\myindex{x86!\Instructions!LOOP}
\myindex{x86!\Instructions!RCL}
Современные компиляторы не генерируют инструкции \TT{LOOP} и \TT{RCL}. 
С другой стороны, эти инструкции хорошо знакомы кодерам, предпочитающим писать прямо на ассемблере. 
Подобные инструкции отмечены как (M) в списке инструкций в приложении: 
\myref{sec:x86_instructions}.
Если такие инструкции встретились, можно сказать с какой-то вероятностью, что этот фрагмент кода написан вручную.

\par
Также, пролог/эпилог функции обычно не встречается в ассемблерном коде, написанном вручную.

\par
Как правило, в вручную написанном коде, нет никакого четкого метода передачи аргументов в функцию.

\par
Пример из ядра Windows 2003 
(файл ntoskrnl.exe):

\lstinputlisting[style=customasmx86]{digging_into_code/ntoskrnl.lst}

Действительно, если заглянуть в исходные коды 
\ac{WRK} v1.2, данный код можно найти в файле \\
\IT{WRK-v1.2\textbackslash{}base\textbackslash{}ntos\textbackslash{}ke\textbackslash{}i386\textbackslash{}cpu.asm}.
